﻿#include "pch.h"
#include "Block1.h"
#include "Game.h"

/**
 * 构造方法。
 */
Block1::Block1() {
    mBlocks[1][1].mUsed = mBlocks[1][2].mUsed = mBlocks[2][1].mUsed = mBlocks[2][2].mUsed = TRUE;
}

/**
 * 进入预览区域。
 * @param drawer    绘图者
 */
void Block1::EnterPreview(CDC* drawer) {
    int x = Const::PREVIEW_WIDTH / 2 - Const::GRID_SIZE;
    int y = Const::PREVIEW_HEIGHT / 2 - Const::GRID_SIZE;

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            CRect rect(x + Const::GRID_SIZE * j, y + Const::GRID_SIZE * i, x + Const::GRID_SIZE * (j + 1), y + Const::GRID_SIZE * (i + 1));
            drawer->FillSolidRect(rect, mColor);
            drawer->DrawEdge(rect, EDGE_RAISED, BF_RECT);
        }
    }
}

/**
 * 擦除。
 */
void Block1::Erase() {
    RECT rect = { 0 };

    rect.left = Const::GRID_SIZE * (mLine + 1);
    rect.top = Const::GRID_SIZE * (mRow + 1);
    rect.right = rect.left + Const::GRID_SIZE * 2;
    rect.bottom = rect.top + Const::GRID_SIZE * 2;
    Block::EraseRect(&rect);
}

/**
 * 获取底端所在的行数。底端是指方块最下方的有效格。
 * @return 底端所在的行数
 */
int Block1::GetBottom() {
    return mRow + 2;
}

/**
 * 获取顶端所在的行数。顶端是指方块最上方的有效格。
 * @return 顶端所在的行数
 */
int Block1::GetTop() {
    return mRow + 1;
}

/**
 * 对不能下落的处理。
 */
void Block1::HandleCannotMoveDown() {
    Game::sExistentBlocks[mRow + 1][mLine + 1].mUsed =
    Game::sExistentBlocks[mRow + 1][mLine + 2].mUsed =
    Game::sExistentBlocks[mRow + 2][mLine + 1].mUsed =
    Game::sExistentBlocks[mRow + 2][mLine + 2].mUsed = TRUE;
    Game::sExistentBlocks[mRow + 1][mLine + 1].mColor =
    Game::sExistentBlocks[mRow + 1][mLine + 2].mColor =
    Game::sExistentBlocks[mRow + 2][mLine + 1].mColor =
    Game::sExistentBlocks[mRow + 2][mLine + 2].mColor = mColor;
}

/**
 * 下落。
 * @return 成功则返回 TRUE，否则返回 FALSE
 */
BOOL Block1::MoveDown() {
    if (mRow == 17) {
        this->HandleCannotMoveDown();
        return FALSE;
    }
    if (Game::sExistentBlocks[mRow + 3][mLine + 1].mUsed ||
        Game::sExistentBlocks[mRow + 3][mLine + 2].mUsed) {
        this->HandleCannotMoveDown();
        return FALSE;
    }

    return Block::MoveDown();
}

/**
 * 左移。
 */
void Block1::MoveLeft() {
    if (mLine == -1) {
        return;
    }
    if (Game::sExistentBlocks[mRow + 1][mLine].mUsed || 
        Game::sExistentBlocks[mRow + 2][mLine].mUsed) {
        return;
    }

    Block::MoveLeft();
}

/**
 * 右移。
 */
void Block1::MoveRight() {
    if (mLine == 7) {
        return;
    }
    if (Game::sExistentBlocks[mRow + 1][mLine + 3].mUsed || 
        Game::sExistentBlocks[mRow + 2][mLine + 3].mUsed) {
        return;
    }

    Block::MoveRight();
}

/**
 * 变形。
 */
void Block1::Transform() {
}
